using System;

namespace SharpMud.Net.Telnet.IAC
{
	public class ControlCodes
	{
		/// <summary>
		/// The 'IAC' byte. Makes it all happen.
		/// </summary>
		public static ControlCode IAC
		{
			get
			{
				return new ControlCode("IAC", 255);
			}
		}
		/// <summary>
		/// The 'WILL' byte. Used as a query in feature negotiation to designate a willingness
		/// to provide a particular feature.
		/// </summary>
		public static ControlCode WILL
		{
			get
			{
				return new ControlCode("WILL", 251);
			}
		}
		/// <summary>
		/// The 'WONT' byte. Used as a query in feature negotiation to designate a refusal
		/// of a particular feature.
		/// </summary>
		public static ControlCode WONT
		{
			get
			{
				return new ControlCode("WONT", 252);
			}
		}
		/// <summary>
		/// The 'DO' byte. Used as a query in feature negotiation to demand support for
		/// a particular feature.
		/// </summary>
		public static ControlCode DO
		{
			get
			{
				return new ControlCode("DO", 253);
			}
		}
		/// <summary>
		/// The 'DONT' byte. Used as a query in feature negotiation to demand that
		/// a particular feature not be used.
		/// </summary>
		public static ControlCode DONT
		{
			get
			{
				return new ControlCode("DONT", 254);
			}
		}
		/// <summary>
		/// The 'SE' byte is used (when prefixed with the 'IAC' byte) to designate the end
		/// of a block of subrequest data.
		/// </summary>
		public static ControlCode SE
		{
			get
			{
				return new ControlCode("SE", 240);
			}
		}

		public static ControlCode NOP
		{
			get
			{
				return new ControlCode("NOP", 241);
			}
		}
		public static ControlCode DataMark
		{
			get
			{
				return new ControlCode("DataMark", 242);
			}
		}
		public static ControlCode Break
		{
			get
			{
				return new ControlCode("Break", 243);
			}
		}
		public static ControlCode IP
		{
			get
			{
				return new ControlCode("IP", 244);
			}
		}
		public static ControlCode AO
		{
			get
			{
				return new ControlCode("AO", 245);
			}
		}
		public static ControlCode AYT
		{
			get
			{
				return new ControlCode("AYT", 246);
			}
		}
		public static ControlCode EC
		{
			get
			{
				return new ControlCode("EC", 247);
			}
		}
		public static ControlCode EL
		{
			get
			{
				return new ControlCode("EL", 248);
			}
		}
		/// <summary>
		/// The 'GA' byte, when prefixed with 'IAC' byte, is used to tell the other end of a telnet connection
		/// that is okay to send data.
		/// </summary>
		public static ControlCode GA
		{
			get
			{
				return new ControlCode("GA", 249);
			}
		}
		/// <summary>
		/// The 'SB' byte (when prefixed with 'IAC' byte) is used to designate the start of a subrequest block.
		/// </summary>
		public static ControlCode SB
		{
			get
			{
				return new ControlCode("SB", 250);
			}
		}
		/// <summary>
		/// The 'ECHO' feature code is used in negotiating client/server echo issues.
		/// </summary>
		public static ControlCode ECHO
		{
			get
			{
				return new ControlCode("ECHO", 1);
			}
		}
		/// <summary>
		/// The 'IS' byte is used as, well, IS, in subrequests. Used often in response to a SEND subrequest.
		/// </summary>
		public static ControlCode IS
		{
			get
			{
				return new ControlCode("IS",0);
			}
		}
		/// <summary>
		/// The 'SEND' byte is used in a subrequest to request an 'IS' subqrequest.
		/// </summary>
		public static ControlCode SEND
		{
			get
			{
				return new ControlCode("SEND",1);
			}
		}
		/// <summary>
		/// The 'SGA' code. "Suppress Go-Ahead". Used to tell a server that it doesn't need to send the Go-Ahead
		/// code.
		/// </summary>
		public static ControlCode SGA
		{
			get
			{
				return new ControlCode("SGA",3);
			}
		}

		public class TELOPT
		{
			/// <summary>
			/// The 'NAWS' code. 'Negotiating About Window Size'. Used to get the window size of the client.
			/// </summary>
			public static ControlCode NAWS
			{
				get
				{
					return new ControlCode("TELOPT_NAWS", 31);
				}
			}
		
			/// <summary>
			/// The 'EOR' code is used to designate the End Of Record.
			/// </summary>
			public static ControlCode EOR
			{
				get
				{
					return new ControlCode("TELOPT_EOR", 25);
				}
			}
			/// <summary>
			/// The 'TTYPE' code is used to negotiate and detect the client's terminal type.
			/// </summary>
			public static ControlCode TTYPE
			{
				get
				{
					return new ControlCode("TELOPT_TTYPE", 24);
				}
			}
			/// <summary>
			/// The code for MSP - the Mud Sound Protocol - quite a nice little enhancement to mudding.
			/// </summary>
			public static ControlCode MSP
			{
				get
				{
					return new ControlCode("TELOPT_MSP",90);
				}
			}
			/// <summary>
			/// The code for MXP - the Mud eXtension Protocol - thats right, Mud + ((XML + HTML)/Telnet) = Awesome.
			/// </summary>
			public static ControlCode MXP
			{
				get
				{
					return new ControlCode("TELOPT_MXP",91);
				}
			}
			/// <summary>
			/// The code for MCCP - the Mud Communcations Compression Protocol - version 1.
			/// </summary>
			public static ControlCode COMPRESS
			{
				get
				{
					return new ControlCode("TELOPT_COMPRESS",85);
				}
			}
			/// <summary>
			/// The code for MCCP - the Mud Communcations Compression Protocol - version 2.
			/// </summary>
			public static ControlCode COMPRESS2
			{
				get
				{
					return new ControlCode("TELOPT_COMPRESS2",86);
				}
			}
		}
	}
}
